home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE Compressions;⓪ (*$R-,Y+*)⓪ ⓪ (*⓪"16.09.89: Korrektur in Decode.readCode⓪ *)⓪ ⓪ ⓪ (*⓪ FROM InOut IMPORT WriteString, WriteLn, WriteCard, Write;⓪ ⓪ FROM StrConv IMPORT CardToStr, HexToStr;⓪ *)⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER;⓪ ⓪ FROM SYSTEM IMPORT ADDRESS,⓪7TSIZE;⓪ ⓪ FROM Storage IMPORT ALLOCATE, DEALLOCATE;⓪ ⓪ FROM BinOps IMPORT LowerLCard;⓪ ⓪ IMPORT Block;⓪ ⓪ ⓪ CONST maxTable = 2047;⓪(maxHash = 4073; (* Sollte prim sein *)⓪(hashStep = 31; (* Sollte prim sein *)⓪(maxStr = 49;⓪ ⓪(increaseWidth = 256;⓪(newTable = 257;⓪(firstFreeEntry = 258;⓪ ⓪ TYPE ptrChar = POINTER TO CHAR;⓪(ptrCard = POINTER TO CARDINAL;⓪(string = ARRAY[0..maxStr] OF CHAR;⓪ ⓪(hashTaElem = RECORD⓪<used: BOOLEAN;⓪<elem: CARDINAL;⓪:END;⓪(hashTable = POINTER TO ARRAY[0..MaxCard] OF hashTaElem;⓪ ⓪((* ACHTUNG: 'copyCurrentIntoTable' und 'stringsEqual' baut auf⓪)* dem Aussehen des Record's auf.⓪)*)⓪(codeTaElem = RECORD⓪<len: CARDINAL;⓪<str: string;⓪:END;⓪(codeTable = POINTER TO ARRAY[0..MaxCard] OF codeTaElem;⓪(⓪((* ACHTUNG: 'Decode' baut auf der Länge des Record's auf.⓪)* (Bei Array indizierung)⓪)* 'initDecodeTable' baut auf der STRUKTUR des Record's⓪)* auf.⓪)*)⓪(decodeTaElem = RECORD⓪<prefix: CARDINAL;⓪<first, last: CHAR;⓪:END;⓪(decodeTable = POINTER TO ARRAY[0..MaxCard] OF decodeTaElem;⓪ ⓪ ⓪ PROCEDURE initCodeTable (table: codeTable; hash: hashTable);⓪"VAR i: CARDINAL;⓪"BEGIN⓪$FOR i:= 0 TO 255 DO⓪&table^[i].str[0]:= CHR (i);⓪&table^[i].str[1]:= 0C;⓪$END;⓪$FOR i := 0 TO maxHash DO hash^[i].used := FALSE END;⓪"END initCodeTable;⓪ ⓪ (* VAR bei 'currentString' nur aus Effizenzgründen.⓪!*)⓪ PROCEDURE searchCodeTable (VAR currentString: string;⓪?stringLength : CARDINAL;⓪?table : codeTable;⓪?hash : hashTable;⓪;VAR success : BOOLEAN;⓪;VAR newCode : CARDINAL;⓪?newEntry : CARDINAL);⓪?⓪"VAR i: CARDINAL;⓪"⓪"(*$L-*)⓪"PROCEDURE stringsEqual (entryNo: CARDINAL): BOOLEAN;⓪"⓪$BEGIN⓪&ASSEMBLER⓪(MOVE.W #maxStr, D0⓪(ADDQ.W #4, D0 ; 'str' fängt bei null an + 'len'⓪(AND.W #-2, D0 ; außerdem grade Anzahl von bytes⓪(MULU -(A3), D0⓪(MOVE.L table(A6), A0⓪(MOVE.W #FALSE, (A3)+⓪(ADDA.L D0, A0⓪(LEA codeTaElem.str(A0), A1⓪(MOVE.L currentString(A6), A2⓪(MOVE.W stringLength(A6), D1⓪(CMP.W codeTaElem.len(A0), D1⓪(BNE ende⓪ ⓪(SUBQ.W #1, D1⓪ loop⓪(MOVE.B (A1)+, D0⓪(CMP.B (A2)+, D0⓪(DBNE D1, loop⓪(BNE ende⓪(MOVE.W #TRUE, -2(A3)⓪(⓪ ende⓪&END;⓪$END stringsEqual;⓪$(*$L=*)⓪$⓪"BEGIN⓪$⓪$i := (stringLength + ORD (currentString[0]) * 256) MOD (maxHash + 1);⓪$⓪$success := FALSE;⓪$WHILE hash^[i].used AND NOT success DO⓪$⓪&IF stringsEqual (hash^[i].elem) THEN⓪ (*⓪ currentString[stringLength] := 0C;⓪ table^[hash^[i].elem].str[table^[hash^[i].elem].len] := 0C;⓪ WriteString (currentString); WriteString (' = ');⓪ WriteString (table^[hash^[i].elem].str); WriteLn;⓪ *)⓪(success := TRUE;⓪(newCode := hash^[i].elem;⓪ (*⓪ WriteString (' code: '); WriteCard (newCode, 0); WriteLn;⓪ *)⓪&ELSE⓪(i := (i + hashStep) MOD (maxHash + 1);⓪&END;⓪&⓪$END;⓪$IF NOT success THEN⓪&hash^[i].used := TRUE;⓪&hash^[i].elem := newEntry;⓪$END;⓪$⓪$(*⓪$i := firstFreeEntry;⓪$success := FALSE;⓪$⓪$WHILE (i < newEntry) AND NOT success DO⓪&⓪&IF stringsEqual () THEN⓪(newCode := i;⓪(success := TRUE;⓪(⓪&ELSE INC (i); END;⓪$⓪$END;⓪$*)⓪$⓪"END searchCodeTable;⓪#⓪ PROCEDURE Encode ( type : CARDINAL;⓪6source : ADDRESS;⓪6sourceLen: LONGCARD;⓪6dest : ADDRESS;⓪6destLen : LONGCARD;⓪2VAR codeLen : LONGCARD);⓪ ⓪"VAR currentString : string;⓪&stringLength,⓪&nextEntry,⓪¤tCode,⓪&nextW,⓪&newCode,⓪&bitWidth, bit : CARDINAL;⓪&i : LONGCARD;⓪&success : BOOLEAN;⓪&ch : CHAR;⓪&table : codeTable;⓪&hash : hashTable;⓪&destLenSave : LONGCARD;⓪&destSave : ptrCard;⓪&charSource : ptrChar;⓪&destLP : POINTER TO LONGCARD;⓪ ⓪"PROCEDURE writeCode (c: CARDINAL);⓪"⓪$(*$L-*)⓪$BEGIN⓪&ASSEMBLER⓪(MOVE.L D3, -(A7)⓪ ⓪(MOVE.L dest(A6), A0⓪(MOVE.L codeLen(A6), A1⓪(MOVE.L (A1), D3⓪(MOVE.L destLen(A6), D2⓪(MOVEQ #0, D0⓪(MOVE.W -(A3), D0⓪(MOVE.W bit(A6), D1⓪(BEQ noOr⓪(LSL.L D1, D0⓪(TST.L D2⓪(BEQ noOr⓪(OR.B (A0), D0⓪ noOr⓪(ADD.W bitWidth(A6), D1⓪ loop⓪(ADDQ.L #1, D3⓪(SUBQ.L #1, D2⓪(BCS notEnoughRoom⓪(MOVE.B D0, (A0)+⓪(LSR.L #8, D0⓪(BRA cont⓪ notEnoughRoom⓪(ADDQ.L #1, D2⓪ cont⓪(SUBQ.W #8, D1⓪(BHI loop⓪(BEQ notByteAligned⓪(⓪(SUBQ.L #1, A0⓪(ADDQ.L #1, D2⓪(SUBQ.L #1, D3⓪(ADDQ.W #8, D1⓪ ⓪ notByteAligned⓪(MOVE.W D1, bit(A6)⓪(MOVE.L D2, destLen(A6)⓪(MOVE.L D3, (A1) ; codelen⓪(MOVE.L A0, dest(A6)⓪(⓪(MOVE.L (A7)+, D3⓪&END;⓪$END writeCode;⓪$(*$L=*)⓪"⓪"PROCEDURE copyCurrentIntoTable;⓪"⓪$(*$L-*)⓪$BEGIN⓪&ASSEMBLER⓪(MOVE.W #maxStr, D0⓪(ADDQ.W #4, D0 ; 'str' fängt bei null an + 'len'⓪(AND.W #-2, D0 ; außerdem gerade Anzahl von bytes⓪(MULU nextEntry(A6), D0⓪(MOVE.L table(A6), A0⓪(ADDA.L D0, A0⓪(LEA codeTaElem.str(A0), A1⓪(LEA currentString(A6), A2⓪(MOVE.W stringLength(A6), D0⓪(MOVE.W D0, codeTaElem.len(A0)⓪(SUBQ.W #1, D0⓪ loop⓪(MOVE.B (A2)+, (A1)+⓪(DBF D0, loop⓪&END;⓪$END copyCurrentIntoTable;⓪$(*$L=*)⓪0⓪"BEGIN (* Encode *)⓪ ⓪$codeLen := 0L;⓪$IF sourceLen = 0L THEN RETURN END;⓪$ALLOCATE (table, TSIZE (codeTaElem) * LONG (maxTable + 1));⓪$IF table = NIL THEN RETURN END;⓪$ALLOCATE (hash, TSIZE (hashTaElem) * LONG (maxHash + 1));⓪$IF hash = NIL THEN⓪&DEALLOCATE (table, 0 (* TSIZE (codeTaElem) * LONG (maxTable + 1) *) );⓪&RETURN⓪$END;⓪$IF dest = NIL THEN destLen := 0L END;⓪$charSource := ptrChar (source);⓪$⓪$bit := 0;⓪$bitWidth := 9;⓪$nextW := 512;⓪$nextEntry := firstFreeEntry;⓪$initCodeTable (table, hash);⓪$ch := charSource^;⓪$INC (charSource);⓪$currentString[0] := ch;⓪$stringLength := 1;⓪$currentCode := ORD (ch);⓪$⓪$(* 1. CARDINAL des Ausgabepuffers erhält Kodierungskennung, 0=keine Kod. *)⓪$(* Darauf folgt die Originallänge als LONGCARD *)⓪$destSave:= dest;⓪$destLenSave:= destLen;⓪$INC (codeLen,6);⓪$IF destLen >= 6L THEN⓪&(* 1. Byte vom Puffer überspringen *)⓪&INC (dest,6);⓪&DEC (destLen,6);⓪$ELSE⓪&destLen:= 0⓪$END;⓪ ⓪$FOR i := 2L TO sourceLen DO⓪&ch := charSource^;⓪&INC (charSource);⓪¤tString[stringLength] := ch;⓪&INC (stringLength);⓪&searchCodeTable (currentString, stringLength, table, hash,⓪7success, newCode, nextEntry);⓪&⓪&IF success AND (stringLength # maxStr) THEN⓪(currentCode := newCode⓪&ELSE⓪(writeCode (currentCode);⓪(IF NOT success THEN⓪*copyCurrentIntoTable;⓪*INC (nextEntry);⓪*IF nextEntry = maxTable THEN⓪,writeCode (newTable);⓪,initCodeTable (table, hash);⓪,bitWidth := 9;⓪,nextW := 512;⓪,nextEntry := firstFreeEntry;⓪*END;⓪(END;⓪(⓪(IF nextEntry = nextW THEN⓪*INC (nextW, nextW);⓪*writeCode (increaseWidth);⓪*INC (bitWidth);⓪(END;⓪(currentString[0] := ch;⓪(stringLength := 1;⓪(currentCode := ORD (ch);⓪&END;⓪$END;⓪$writeCode (currentCode);⓪$IF bit # 0 THEN INC (codeLen) END;⓪$IF destLenSave >= 6L THEN⓪&IF codeLen > sourceLen THEN⓪((* Kodierung verwerfen, Daten unkodiert übernehmen *)⓪(codeLen:= sourceLen + 6L;⓪(Block.Copy (source,⓪4LowerLCard (sourceLen, destLenSave - 6L),⓪4ADDRESS (destSave) + 6L);⓪((* Kennung: Daten nicht kodiert *)⓪(destSave^:= 0;⓪&ELSE⓪((* Kennung: Daten kodiert *)⓪(destSave^:= 1;⓪&END;⓪&IF codeLen > destLenSave THEN⓪((* Kennung: Daten nicht vollständig *)⓪(destSave^:= MaxCard;⓪&END;⓪&destLP:= ADDRESS (destSave) + 2L;⓪&destLP^:= sourceLen⓪$END;⓪$DEALLOCATE (table, 0 (* TSIZE (codeTaElem) * LONG (maxTable + 1) *) );⓪$DEALLOCATE (hash, 0 (* TSIZE (hashTaElem) * LONG (maxHash + 1) *) );⓪"END Encode;⓪ ⓪ ⓪ PROCEDURE initDecodeTable (VAR table: decodeTable);⓪ ⓪"(*⓪"VAR i : CARDINAL;⓪"BEGIN⓪"⓪$FOR i := 0 TO 255 DO⓪&table^[i].first := CHR(i);⓪&table^[i].last := CHR(i);⓪&table^[i].prefix := MaxCard;⓪$END;⓪$⓪"END initDecodeTable;⓪"*)⓪"⓪"(*$L-*)⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.W #255, D0⓪(MOVE.L #-1 - $FFFF, D1⓪(MOVE.L -(A3), A0⓪(MOVE.L (A0), A0⓪ loop⓪(MOVE.L D1, (A0)+⓪(ADD.W #$0101, D1⓪(DBF D0, loop⓪$END;⓪"END initDecodeTable;⓪"(*$L=*)⓪ ⓪ ⓪ PROCEDURE Decode ( source : ADDRESS;⓪6sourceLen: LONGCARD;⓪6dest : ADDRESS;⓪6destLen : LONGCARD;⓪2VAR success : BOOLEAN );⓪"⓪"CONST tabElemSize = 4;⓪ ⓪"VAR table : decodeTable;⓪&lastCode,⓪&code, nextEntry,⓪&bit, bitWidth : CARDINAL;⓪&endOfSource : BOOLEAN;⓪&kennung : ptrCard;⓪&ptrL : POINTER TO LONGCARD;⓪&charDest : ptrChar;⓪ ⓪ ⓪"PROCEDURE readCode (): CARDINAL;⓪$⓪$(*$L-*)⓪$BEGIN⓪&ASSEMBLER⓪(MOVE.L D3, -(A7)⓪(MOVE.L D4, -(A7)⓪(⓪(MOVE.L source(A6), A0⓪(MOVE.L sourceLen(A6), D2⓪(MOVE.W bitWidth(A6), D1⓪(ADD.W bit(A6), D1⓪(MOVEQ #0, D3⓪(MOVEQ #0, D0⓪(⓪ loop⓪(TST.L D2⓪(BEQ sourceEnded⓪(MOVEQ #0,D4⓪(MOVE.B (A0)+, D4⓪(LSL.L D3, D4⓪(OR.L D4, D0⓪(ADDQ.W #8, D3⓪(SUBQ.L #1, D2⓪(SUBQ.W #8, D1⓪(BHI loop⓪(BEQ notByteAligned⓪(⓪(SUBQ.L #1, A0⓪(ADDQ.L #1, D2⓪(⓪ notByteAligned⓪(MOVE.W bit(A6), D1⓪(LSR.L D1, D0⓪(ADD.W bitWidth(A6), D1⓪(ANDI.W #7, D1⓪(MOVE.W D1, bit(A6)⓪(MOVE.L A0, source(A6)⓪(MOVE.L D2, sourceLen(A6)⓪(MOVEQ #-1, D1⓪(MOVE.W bitWidth(A6), D2⓪(LSL.W D2, D1⓪(NOT D1⓪(AND.W D1, D0⓪(BRA ende⓪ ⓪ sourceEnded⓪(MOVE.W #TRUE, endOfSource(A6)⓪ ⓪ ende⓪(MOVE.W D0, (A3)+⓪(⓪(MOVE.L (A7)+, D4⓪(MOVE.L (A7)+, D3⓪&END;⓪$END readCode;⓪$(*$L=*)⓪$⓪"PROCEDURE writeCode (code: CARDINAL);⓪$⓪$(*⓪$VAR last, next,⓪(zws : CARDINAL;⓪(back : BOOLEAN;⓪$⓪$BEGIN⓪&back := FALSE;⓪&next := table^[code].prefix;⓪&last := MaxCard;⓪&WHILE NOT back OR (next # MaxCard) DO⓪&⓪(IF next = MaxCard THEN⓪*back := TRUE;⓪*zws := next; next := last; last := zws;⓪(ELSE⓪*table^[code].prefix := last;⓪*last := code;⓪*code := next;⓪*next := table^[code].prefix;⓪(END;⓪(IF back AND (destLen # 0L) THEN⓪*charDest^ := table^[code].last;⓪*INC (charDest);⓪*DEC (destLen);⓪(END;⓪'⓪&END;⓪&table^[code].prefix := last;⓪$END writeCode;⓪$*)⓪$⓪$(*$L-*)⓪$BEGIN⓪&ASSEMBLER⓪(MOVEM.L D3-D4, -(A7)⓪(⓪(; D0.W -- 'next'⓪(; D1.W -- 'code'⓪(; D2.W -- 'last'⓪(; D3.W -- 'back'⓪(; D4.W -- zws⓪(; A0.L -- 'table'⓪(; A1.L -- zws⓪(; A2.L -- 'charDest'⓪(;⓪(MOVE.L table(A6), A0 ; 'table' -> A0⓪(MOVE.L charDest(A6), A2 ; 'charDest' -> A2⓪(MOVE.W -(A3), D1 ; 'code' -> D1⓪(CLR.W D3 ; 'back := FALSE'⓪(MOVE.L A0, A1⓪(MOVE.W D1, D4⓪(EXT.L D4⓪(LSL.L #2, D4⓪(MOVE.W decodeTaElem.prefix(A1,D4.L),D0 ; 'table^[code].prefix' -> D0⓪(MOVE.W #MaxCard, D2 ; 'MaxCard' -> D2⓪ loop⓪(TST.W D3⓪(BEQ loopBody⓪(CMP.W #MaxCard, D0⓪(BEQ loopEnd⓪H; WHILE NOT back OR (next # MaxCard) DO⓪ loopBody⓪(CMP.W #MaxCard, D0⓪(BNE else⓪(⓪(MOVE.W #TRUE, D3; ; 'back := TRUE'⓪(EXG D0, D2 ; EXG ('next', 'last')⓪(BRA if1End⓪ else⓪ ⓪(MOVE.L A0, A1⓪(MOVE.W D1, D4⓪(EXT.L D4⓪(LSL.L #2, D4⓪(MOVE.W D2, decodeTaElem.prefix(A1,D4.L); 'table^[code].prefix := last'⓪(MOVE.W D1, D2 ; 'last := code'⓪(MOVE.W D0, D1 ; 'code := next'⓪(MOVE.L A0, A1⓪(MOVE.W D1, D4⓪(EXT.L D4⓪(LSL.L #2, D4⓪(MOVE.W decodeTaElem.prefix(A1,D4.L),D0 ; 'next := table^[code].prefix'⓪(⓪ if1End⓪(TST.W D3⓪(BEQ if2End⓪(TST.L destLen(A6)⓪(BEQ if2End⓪(⓪(; 'charDest^ := table^[code].last'⓪(; 'INC (charDest)'⓪(;⓪(MOVE.L A0, A1⓪(MOVE.W D1, D4⓪(EXT.L D4⓪(LSL.L #2, D4⓪(MOVE.B decodeTaElem.last(A1,D4.L), (A2)+⓪(⓪(SUBQ.L #1, destLen(A6) ; 'DEC (destLen)'⓪ if2End⓪(BRA loop⓪(⓪ loopEnd⓪(MOVE.L A0, A1⓪(MOVE.W D1, D4⓪(EXT.L D4⓪(LSL.L #2, D4⓪(MOVE.W D2,decodeTaElem.prefix(A1,D4.L) ; 'table^[code].prefix := last'⓪(MOVE.L A2,charDest(A6) ; setzt neuen 'charDest'⓪(⓪(MOVEM.L (A7)+, D3-D4⓪&END;⓪$END writeCode;⓪$(*$L=*)⓪$⓪ (*⓪"PROCEDURE toBuffer (str: ARRAY OF CHAR);⓪$VAR i: CARDINAL;⓪$BEGIN⓪&i := 0;⓪&WHILE (HIGH (str) >= i) AND (str[i] # 0C) AND (destLen # 0L) DO⓪(charDest^ := str[i];⓪(INC (charDest);⓪(DEC (destLen);⓪(INC (i);⓪&END;⓪$END toBuffer;⓪ *)⓪ ⓪"BEGIN (* Decode *)⓪ ⓪$success:= FALSE;⓪ ⓪$IF sourceLen <= 6L THEN ASSEMBLER MOVEQ #3,D1 END; RETURN END;⓪$kennung:= source;⓪$INC (source, 6L);⓪$DEC (sourceLen, 6L);⓪$IF kennung^ = 0 THEN⓪ ⓪&IF destLen >= sourceLen THEN⓪(Block.Copy (source, sourceLen, dest);⓪(success:= TRUE⓪&END; (* ansonsten bleibt 'success' FALSE *)⓪&ASSEMBLER MOVEQ #2,D1 END;⓪ ⓪$ELSIF kennung^ = 1 THEN⓪ ⓪&ALLOCATE (table, TSIZE(decodeTaElem) * LONG (maxTable + 1));⓪&IF table = NIL THEN ASSEMBLER MOVEQ #1,D1 END; RETURN END;⓪&IF dest = NIL THEN destLen := 0L END;⓪&charDest := dest;⓪ ⓪&bit := 0;⓪&bitWidth := 9;⓪&nextEntry := firstFreeEntry;⓪&initDecodeTable (table);⓪&endOfSource := FALSE;⓪&code := readCode ();⓪&lastCode := code;⓪&writeCode (code);⓪&⓪&IF NOT endOfSource THEN code := readCode () END;⓪&(*⓪&WHILE NOT endOfSource DO⓪&⓪(IF code = increaseWidth THEN INC (bitWidth);⓪(ELSIF code = newTable THEN⓪(⓪*(*initDecodeTable (table);*)⓪*bitWidth := 9;⓪*nextEntry := firstFreeEntry;⓪ ⓪*code := readCode ();⓪*lastCode := code;⓪*writeCode (code);⓪*⓪(ELSIF code < nextEntry THEN⓪(⓪*writeCode (code);⓪*table^[nextEntry].prefix := lastCode;⓪*table^[nextEntry].first := table^[lastCode].first;⓪*table^[nextEntry].last := table^[code].first;⓪*INC (nextEntry);⓪*lastCode := code;⓪*⓪(ELSE⓪(⓪*table^[nextEntry].prefix := lastCode;⓪*table^[nextEntry].first := table^[lastCode].first;⓪*table^[nextEntry].last := table^[lastCode].first;⓪*writeCode (nextEntry);⓪*lastCode := nextEntry;⓪*INC (nextEntry);⓪*⓪(END;⓪(⓪(code := readCode ();⓪"(*⓪"toBuffer (15C); toBuffer (12C);⓪"toBuffer (HexToStr (code, 0)); toBuffer ('=');⓪"*)⓪&END;⓪&*)⓪&ASSEMBLER⓪ whileStart⓪(TST.W endOfSource(A6)⓪(BNE.W whileEnd ; 'WHILE NOT endOfSource DO'⓪(⓪(MOVE.W code(A6), D0⓪(CMP.W #increaseWidth, D0⓪(BNE elsif1⓪(⓪(ADDQ.W #1, bitWidth(A6)⓪(BRA.W ifEnd⓪(⓪ elsif1⓪(CMP.W #newTable, D0⓪(BNE elsif2⓪(⓪(MOVE.W #9, bitWidth(A6) ; 'bitWidth := 9'⓪(MOVE.W #firstFreeEntry, nextEntry(A6) ; 'nextEntry := firstFreeEntry'⓪(BSR readCode⓪(MOVE.W -2(A3), D0⓪(MOVE.W D0, code(A6) ; 'code := readCode ()'⓪(MOVE.W D0, lastCode(A6) ; 'lastCode := code'⓪(BSR writeCode ; 'writeCode (code)'⓪(BRA.W ifEnd⓪ ⓪ elsif2⓪(CMP.W nextEntry(A6), D0⓪(BCC else⓪(⓪(MOVE.W D0, (A3)+⓪(BSR writeCode ; 'writeCode (code)'⓪(MOVE.L table(A6), A0⓪(MOVE.L A0, A1⓪(MOVE.L A0, A2⓪(MOVE.W nextEntry(A6), D1⓪(EXT.L D1⓪(LSL.L #2, D1⓪(ADDA.L D1, A0⓪(MOVE.W lastCode(A6), D1⓪(MOVE.W D1, D2⓪(EXT.L D1⓪(LSL.L #2, D1⓪(ADDA.L D1, A1⓪(MOVE.W code(A6), D1⓪(EXT.L D1⓪(LSL.L #2, D1⓪(ADDA.L D1, A2⓪(⓪(; table^[nextEntry].prefix := lastCode;⓪(;⓪(MOVE.W D2, decodeTaElem.prefix(A0)⓪(⓪(; table^[nextEntry].first := table^[lastCode].first;⓪(;⓪(MOVE.B decodeTaElem.first(A1), decodeTaElem.first(A0)⓪(⓪(; table^[nextEntry].last := table^[code].first;⓪(;⓪(MOVE.B decodeTaElem.first(A2), decodeTaElem.last(A0)⓪(⓪(ADDQ.W #1, nextEntry(A6) ; 'INC (nextEntry)'⓪(MOVE.W code(A6), lastCode(A6) ; 'lastCode := code'⓪(BRA ifEnd⓪ ⓪ else⓪(MOVE.L table(A6), A0⓪(MOVE.L A0, A1⓪(MOVE.W nextEntry(A6), D1⓪(MOVE.W D1, D2⓪(EXT.L D1⓪(LSL.L #2, D1⓪(ADDA.L D1, A0⓪(MOVE.W lastCode(A6), D1⓪(EXT.L D1⓪(LSL.L #2, D1⓪(ADDA.L D1, A1⓪(⓪(; table^[nextEntry].prefix := lastCode;⓪(;⓪(MOVE.W lastCode(A6), decodeTaElem.prefix(A0)⓪(⓪(; table^[nextEntry].first := table^[lastCode].first;⓪(;⓪(MOVE.B decodeTaElem.first(A1), D0⓪(MOVE.B D0, decodeTaElem.first(A0)⓪(⓪(; table^[nextEntry].last := table^[lastCode].first;⓪(;⓪(MOVE.B D0, decodeTaElem.last(A0)⓪(⓪(MOVE.W D2, (A3)+⓪(BSR writeCode ; 'writeCode (nextEntry)'⓪(MOVE.W nextEntry(A6), lastCode(A6) ; 'lastCode := nextEntry'⓪(ADDQ.W #1, nextEntry(A6) ; 'INC (nextEntry)'⓪ ⓪ ifEnd⓪(BSR readCode⓪(MOVE.W -(A3), code(A6) ; 'code := readCode ()'⓪(BRA whileStart⓪ ⓪ whileEnd⓪&END;⓪&DEALLOCATE (table, 0 (* TSIZE(decodeTaElem) * LONG (maxTable + 1)*) );⓪&⓪&IF destLen = 0L THEN⓪(success:= TRUE⓪&END;⓪&ASSEMBLER MOVEQ #2,D1 END;⓪$ELSE⓪&(* ungültige Kennung! *)⓪&ASSEMBLER MOVEQ #4,D1 END;⓪$END;⓪"END Decode;⓪ ⓪ PROCEDURE GetInfo ( code: ADDRESS;⓪4VAR type: CARDINAL;⓪4VAR length: LONGCARD );⓪"VAR pl: POINTER TO LONGCARD;⓪&pc: ptrCard;⓪"BEGIN⓪$pc:= code;⓪$pl:= code + 2L;⓪$type:= pc^;⓪$length:= pl^⓪"END GetInfo;⓪ ⓪ END Compressions.⓪ ə
- (* $FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$000000ED$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEA7F3A$000015C8$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$000021E3$FFEC9820$FFEC9820$FFEC9820Ç$0000002ET.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000031EC$00003384$0000337B$000031A4$0000426C$000042AB$000042A0$00004261$0000428E$0000424F$000032F6$0000002E$0000006E$00000035$000000ED$00003188ãÇé*)
-